package com.woniuxy.enjoylife.service.impl;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.woniuxy.enjoylife.entity.dto.*;
import com.woniuxy.enjoylife.entity.Recent;
import com.woniuxy.enjoylife.entity.RecentAgree;
import com.woniuxy.enjoylife.entity.RecentComment;
import com.woniuxy.enjoylife.mapper.RecentAgreeMapper;
import com.woniuxy.enjoylife.mapper.RecentCommentMapper;
import com.woniuxy.enjoylife.mapper.RecentMapper;
import com.woniuxy.enjoylife.mapper.UserMapper;
import com.woniuxy.enjoylife.service.RecentService;
import com.woniuxy.enjoylife.utils.OrderNumberCreator;
import com.woniuxy.enjoylife.utils.PageResult;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

/**
 * 动态展示
 */
@Service
public class RecentServiceImpl implements RecentService {

    @Resource
    private RecentMapper recentMapper;
    @Resource
    private RecentAgreeMapper recentAgreeMapper;
    @Resource
    private RecentCommentMapper recentCommentMapper;
    @Resource
    private UserMapper userMapper;


    //查询所有动态
    @Override
    public PageResult<RecentDto> selectRecent(int page, int size, int userid) {
        //装数据的容器
        List<RecentDto> recentDtoList = new ArrayList<>();

        //分页插件，会自动查询时进行分页并将分页信息封装到recentPage内
        Page<Recent> recentPage = PageHelper.startPage(page, size);
        //查询所有的动态
        List<Recent> recentList = recentMapper.selectRecent();

        //遍历每条动态获取单条动态的信息，并封装该动态需要的其他表中查询的数据
        for (Recent recent : recentList) {
            //从动态表中能获取到的数据
            //当前动态的id,发布者的id，内容，图片，时间
            Integer recentId = recent.getId();
            Integer ownerId = recent.getUid();
            String content = recent.getContent();
            String image = recent.getImage();
            LocalDateTime time = recent.getTime();
            //当前用户能否操作该条动态
            boolean isUpdate = recent.getUid().equals(userid);

            //去用户表获取动态发布者的名字
            String ownerName = userMapper.selectById(ownerId).getAccount();

            //去动态点赞表获取点赞数和自己是否能点赞
            List<RecentAgree> recentAgreeList = recentAgreeMapper.select(new RecentAgree().setRecent_id(recentId));
            //点赞的总数
            int agreeNums = recentAgreeList.size();

            //当前用户是否已经点赞
            boolean isAgreed = false;
            for (RecentAgree recentAgree : recentAgreeList) {
                if (recentAgree.getUid() == userid) {
                    isAgreed = true;
                    break;
                }
            }

            //去评论表获取评论者，评论内容，评论时间

            //查询当前动态有关的所有评论
            List<RecentCommentDto2> recentCommentList = recentCommentMapper.selectCommentDto2(recentId);


            //封装单条动态所有的相关数据
            //动态表的数据
            RecentDto recentDto = new RecentDto();
            recentDto.setRecentId(recentId);
            recentDto.setUid(ownerId);
            recentDto.setContent(content);
            recentDto.setImage(image);
            recentDto.setTime(time);
            recentDto.setIsUpdate(isUpdate);

            //用户表的数据
            recentDto.setOwnerName(ownerName);

            //点赞表的数据
            recentDto.setAgreeNum(agreeNums);
            recentDto.setAgree(isAgreed);

            //评论表的数据（所有评论）
            recentDto.setCommentList(recentCommentList);

            recentDtoList.add(recentDto);
        }

        PageResult<RecentDto> pageResult = new PageResult<>();
        pageResult.setCurrentPage(page);
        pageResult.setPageSize(size);
        pageResult.setTotal(recentPage.getTotal());
        pageResult.setTotalPage(recentPage.getPageNum());
        pageResult.setData(recentDtoList);

        return pageResult;
    }

    //查询单个用户动态
    @Override
    public Recent selectSingle(Recent recent) {
        return null;
    }

    //新增
    @Override
    public boolean addRecent(Recent recent,int userid) {
        recent.setUid(userid);
        return recentMapper.addRecent(recent) == 1;
    }

    //修改
    @Override
    public int updateRecent(Recent recent) {
        return recentMapper.updateRecent(recent);
    }

    //删除
    @Override
    public int deleteRecent(int id) {
        return recentMapper.deleteRecent(id);
    }


//********************************用户角度************
    /**
     *   查询用户参与的动态
     */
    @Override
    public List<RecentUserDto> selectUserRecent(int uid){
        List<RecentUserDto> recentUserDtos =recentMapper.selectUserRecent(uid);

        return recentUserDtos;
    }


    /**
     * 平台动态分类查询
     * @param type
     * @param content
     * @return
     */
    @Override
    public List<RecentInfoDto> findType(int type, String content) {
        List<RecentInfoDto> recentInfoDtoList = new ArrayList<>();
        if(type == 0){
            //查询所有
            recentInfoDtoList = recentMapper.findAllRecent();
        }else if(type == 1){
            //按用户名查询
            recentInfoDtoList = recentMapper.findAllRecentByAccount(content);
        }else {
            //按相似内容查询
            recentInfoDtoList = recentMapper.findAllRecentByContent(content);
        }
        return recentInfoDtoList;
    }

    /**
     * 平台删除动态
     * @param id
     * @return
     */
    @Override
    public boolean delRecent(int id) {
        return recentMapper.delRecent(id)>0;
    }

    /**
     * 模糊查询动态
     * @param content
     * @return
     */
    @Override
    public PageResult<RecentDto> findRecentByLike(String content,int current,int size) {
        if(content!=null){
            //模糊查询
            Page<Object> objects = PageHelper.startPage(current, size);
            List<RecentDto> list =  recentMapper.findRecentByLike(content);
            PageResult pageResult = new PageResult().setData(list).setTotal(objects.getTotal()).setTotalPage(objects.getPageNum());
            return pageResult;
        }else{
            //获取分页对象
            Page<Object> objects = PageHelper.startPage(current, size);
            List<RecentDto> list =  recentMapper.findRecentByLike(content);
            PageInfo<RecentDto> pageInfo = new PageInfo<>(list);
            PageResult pageResult = new PageResult().setData(list).setTotal(objects.getTotal()).setTotalPage(objects.getPageNum());

            return pageResult;
        }
    }


}
